package com.study.webapp.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 *
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 *
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 *
 * 请你实现这个将字符串进行指定行数变换的函数：
 *
 * string convert(string s, int numRows);
 *  
 *
 * 示例 1：
 *
 * 输入：s = "PAYPALISHIRING", numRows = 3
 * 输出："PAHNAPLSIIGYIR"
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/zigzag-conversion
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Leet_06 {

	public static void main(String[] args) {
		String Str = "PAYPALISHIRING";
		int c = 4;
		System.out.println(method3(Str, c));
	}


	public static String method3 (String s ,int numRows) {
		if (numRows <2) {
			return s;
		}
		if (s==null || s.length()==0) {
			return s;
		}
		StringBuilder[] builders = new StringBuilder[numRows];
		for (int i=0; i<builders.length;i++) {
			builders[i] = new StringBuilder();
		}
		int dir = 1;
		int index = 0;
		for(char c : s.toCharArray()) {
			builders[index].append(c);
			index += dir;
			if (index == 0 || index == numRows - 1){
				dir = -dir;
			}
		}
		StringBuilder builder = new StringBuilder();
		for (int i= 0;i<builders.length;i++) {
			builder.append(builders[i]);
		}
		return builder.toString();
	}

	/**
	 * 循环原字符串，根据每一个字符串存放新的位置来
	 * 
	 * @param s
	 * @param numRows
	 * @return
	 */
	public static String method2(String s, int numRows) {

		if (numRows == 1) {
			return s;
		}
		// 按照划分的行数来new字符串，一行一个字符串
		List<StringBuilder> rows = new ArrayList<>();
		for (int i = 0; i < Math.min(numRows, s.length()); i++) {
			rows.add(new StringBuilder());
		}
		int curRow = 0;
		boolean goingDown = false;

		for (char c : s.toCharArray()) {
			rows.get(curRow).append(c);
			if (curRow == 0 || curRow == numRows - 1) {
				goingDown = !goingDown;
			}
			curRow += goingDown ? 1 : -1;
		}

		StringBuilder ret = new StringBuilder();
		for (StringBuilder row : rows) {
			ret.append(row);
		}
		return ret.toString();
	}

	public static String method1(String s, int numRows) {

		if (numRows == 1) {
			return s;
		}
		StringBuilder ret = new StringBuilder();
		int n = s.length();
		int cycleLen = 2 * numRows - 2;

		for (int i = 0; i < numRows; i++) {
			for (int j = 0; j + i < n; j += cycleLen) {
				ret.append(s.charAt(j + i));
				if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)
					ret.append(s.charAt(j + cycleLen - i));
			}
		}
		return ret.toString();
	}

}
